<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  function Fn(a, b, c) {
    console.log(this.clothes, a, b, c)
  }

  const o = {
    clothes: "shirt"
  }

  Fn.call(o)

  // 现在手写call函数

  Function.prototype.myCall = function (o, ...args) {
    o.fn = this;
    o.fn(...args)
    delete o.fn
  };

  Fn.myCall(o, 1, 2, 3)


  // var clothes = "shirt"

  // Function.prototype.myCall = function (o) {
  //   o = o || window //解决o对象为null空时报错问题
  //   const newArgs = []
  //   o.fn = this;
  //   for (let i = 1; i < arguments.length; i++) {
  //     // newArgs.push(arguments[i])
  //     newArgs.push("arguments[" + i + "]") //升级版 使用对象字符串不会报错
  //   }
  //   eval("o.fn(" + newArgs + ")")
  //   delete o.fn
  // };

  // Fn.myCall(o, {}, 2, 3)


  //现在手写apply函数

  // Function.prototype.myApply = function (o, arrArgs) {
  //   o = o || window //解决o对象为null空时报错问题
  //   const newArgs = []
  //   o.fn = this;

  //   let res = null


  //   if (!arrArgs) {
  //     res = o.fn()
  //   } else {

  //     for (let i = 0; i < arrArgs.length; i++) {
  //       // newArgs.push(arguments[i])
  //       newArgs.push("arrArgs[" + i + "]") //升级版 使用对象字符串不会报错
  //     }
  //     res = eval("o.fn(" + newArgs + ")")
  //   }
  //   delete o.fn
  //   return res
  // };

  // console.log(Fn.myApply(o, [{}, 2, 3]))



  // bind函数

  // function Fn(a, b) {
  //   console.log(this.clothes, a, b)
  // }

  // const o = {
  //   clothes: "Shirt"
  // }

  // Fn.bind(o, 1)(2)
</script>

</html>